#include "stm32_gpio.h"


uint32_t GPIOC13_Id = GPIO_PC13;
uint32_t GPIOA03_Id = GPIO_PA03;
uint32_t GPIOE09_Id = GPIO_PE09;
uint32_t GPIOE04_Id = GPIO_PE04;

      
/**
  * @brief  GPIO初始化
  * @note   移植时用户需要修改的接口函数
  * @param  GPIO_Id: GPIO外设
  * @param  GPIO_Mode: GPIO模式
  * @param  GPIO_State: GPIO状态
  * @retval 无
  */
int32_t STM32_GPIO_Init(uint32_t *GPIO_Id, uint32_t GPIO_Mode, uint32_t GPIO_State)
{
  GPIO_InitTypeDef GPIO_InitStruct = {0};
  
  switch (*GPIO_Id)
  {
    case GPIO_PC13:
      __HAL_RCC_GPIOC_CLK_ENABLE();
      HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, (GPIO_PinState)GPIO_State);
      GPIO_InitStruct.Pin = GPIO_PIN_13;
      GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
      GPIO_InitStruct.Pull = GPIO_NOPULL;
      GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
      HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
      break;
    
    case GPIO_PA03:
      __HAL_RCC_GPIOA_CLK_ENABLE();
      HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, (GPIO_PinState)GPIO_State);
      GPIO_InitStruct.Pin = GPIO_PIN_3;
      GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
      GPIO_InitStruct.Pull = GPIO_NOPULL;
      GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
      HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
      break;
    
    case GPIO_PE09:
      __HAL_RCC_GPIOE_CLK_ENABLE();
      HAL_GPIO_WritePin(GPIOE, GPIO_PIN_9, (GPIO_PinState)GPIO_State);
      GPIO_InitStruct.Pin = GPIO_PIN_9;
      GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
      GPIO_InitStruct.Pull = GPIO_NOPULL;
      GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
      HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);
      break;
    
    case GPIO_PE04:
      __HAL_RCC_GPIOE_CLK_ENABLE();
      HAL_GPIO_WritePin(GPIOE, GPIO_PIN_4, (GPIO_PinState)GPIO_State);
      GPIO_InitStruct.Pin = GPIO_PIN_4;
      GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
      GPIO_InitStruct.Pull = GPIO_NOPULL;
      GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
      HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);
      break;
    
    default:
      break;
  }
  
  return 0;
}


int32_t STM32_GPIO_DeInit(uint32_t *GPIO_Id)
{
  return 0;
}








static int32_t BSP_GPIO_Init(void *BSP_GPIO_Handle, bsp_gpio_mode_t Mode, bsp_gpio_state_t State);
static int32_t BSP_GPIO_DeInit(void *BSP_GPIO_Handle);
static int32_t BSP_GPIO_Write(void *BSP_GPIO_Handle, bsp_gpio_state_t State);
static int32_t BSP_GPIO_Read(void *BSP_GPIO_Handle, bsp_gpio_state_t *State);

bsp_gpio_t BSP_GPIOC13 = 
{
  &GPIOC13_Id,
  BSP_GPIO_Init,
  BSP_GPIO_DeInit,
  BSP_GPIO_Write,
  BSP_GPIO_Read,
};

bsp_gpio_t BSP_GPIOA03 = 
{
  &GPIOA03_Id,
  BSP_GPIO_Init,
  BSP_GPIO_DeInit,
  BSP_GPIO_Write,
  BSP_GPIO_Read,
};

bsp_gpio_t BSP_GPIOE09 = 
{
  &GPIOE09_Id,
  BSP_GPIO_Init,
  BSP_GPIO_DeInit,
  BSP_GPIO_Write,
  BSP_GPIO_Read,
};

bsp_gpio_t BSP_GPIOE04 = 
{
  &GPIOE04_Id,
  BSP_GPIO_Init,
  BSP_GPIO_DeInit,
  BSP_GPIO_Write,
  BSP_GPIO_Read,
};


/**
  * @brief  BSP GPIO初始化
  * @note   抽象层
  * @param  BSP_GPIO_Handle: BSP GPIO句柄
  * @param  Mode: 模式
  * @param  State: 初始状态
  * @retval 0-成功，其他-失败
  */
static int32_t BSP_GPIO_Init(void *BSP_GPIO_Handle, bsp_gpio_mode_t Mode, bsp_gpio_state_t State)
{
  bsp_gpio_t *bsp_gpio_handle = (bsp_gpio_t *)BSP_GPIO_Handle;
  uint32_t *bsp_gpio_id = bsp_gpio_handle->gpio_handle;
  int32_t res;
  
  res = STM32_GPIO_Init(bsp_gpio_id, Mode, State);
  
  return res;
}


static int32_t BSP_GPIO_DeInit(void *BSP_GPIO_Handle)
{
  bsp_gpio_t *bsp_gpio_handle = (bsp_gpio_t *)BSP_GPIO_Handle;
  uint32_t *bsp_gpio_id = bsp_gpio_handle->gpio_handle;
  int32_t res;
  
  res = STM32_GPIO_DeInit(bsp_gpio_id);
  
  return res;
}


static int32_t BSP_GPIO_Write(void *BSP_GPIO_Handle, bsp_gpio_state_t State)
{
  bsp_gpio_t *bsp_gpio_handle = (bsp_gpio_t *)BSP_GPIO_Handle;
  uint32_t *bsp_gpio_id = bsp_gpio_handle->gpio_handle;
  
  switch (*bsp_gpio_id)
  {
    case GPIO_PC13:
      HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, (GPIO_PinState)State);
      break;
    
    case GPIO_PA03:
      HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, (GPIO_PinState)State);
      break;
    
    case GPIO_PE09:
      HAL_GPIO_WritePin(GPIOE, GPIO_PIN_9, (GPIO_PinState)State);
      break;
    
    case GPIO_PE04:
      HAL_GPIO_WritePin(GPIOE, GPIO_PIN_4, (GPIO_PinState)State);
      break;
    
    default:
      break;
  }
  
  return 0;
}


static int32_t BSP_GPIO_Read(void *BSP_GPIO_Handle, bsp_gpio_state_t *State)
{
  bsp_gpio_t *bsp_gpio_handle = (bsp_gpio_t *)BSP_GPIO_Handle;
  uint32_t *bsp_gpio_id = bsp_gpio_handle->gpio_handle;
  
  switch (*bsp_gpio_id)
  {
    case GPIO_PC13:
      *State = (bsp_gpio_state_t)HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_13);
      break;
    
    case GPIO_PA03:
      *State = (bsp_gpio_state_t)HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_3);
      break;
    
    case GPIO_PE09:
      *State = (bsp_gpio_state_t)HAL_GPIO_ReadPin(GPIOE, GPIO_PIN_9);
      break;
    
    case GPIO_PE04:
      *State = (bsp_gpio_state_t)HAL_GPIO_ReadPin(GPIOE, GPIO_PIN_4);
      break;
    
    default:
      break;
  }
  
  return 0;
}


